﻿//【初阶】16.vector(2)

//【头文件包含】
//C++的主要头文件



#include<iostream>//c++的输入输出流
using std::cout, std::endl, std::cin;
#include"vector.h" 

//C的主要头文件
//#include<stdio.h>
//#include<stdlib.h>
//#include<assert.h>
//#include<string.h> 




//【命名空间】

//【结构体声明】【类声明】



//【函数声明】
void Test1();void Test2();void Test3();



//【主函数】
int main()
{
	
	Test1();
	Test2();
	Test3();
	
	cout << "****主函数结束****" << endl;
	return 0;
}


/*测试用例*/void Test1()
{

	cout << "****测试用例开始****"<< endl;
	//using myspace::vector;
	myspace::test_vector1();
	
	cout << "****测试用例结束****" << endl << endl;

}

#include<vector>
using std::vector;
/*OJ找出一个数组中仅有的两个只出现一次的数，其他都是成对出现*/
vector<int> singleNumber(vector<int>& nums)
{
	vector<int>ret;
	ret.push_back(0);
	ret.push_back(0);
	int x = 0;
	int v = 0;
	for (auto a : nums)
	{
		v ^= a;
	}
	while ((v &(1<<x)) == 0)
	{
		++x;
	}
	for (auto a : nums)
	{
		if (a&(1<<x))
		{
			ret[0] ^= a;
		}
		else
		{
			ret[1] ^= a;
		}
	}
	return ret;
}
/*OJ输出杨辉三角*/
vector<vector<int>> generate(int numRows)
{
	vector<vector<int>> ret;
	ret.resize(numRows);
	for (size_t i = 0; i < numRows; ++i)
	{
		ret[i].resize(i + 1);
		ret[i][0] = 1;
		ret[i][ret[i].size() - 1] = 1;
	}
	for (size_t i = 0; i < ret.size(); ++i)
	{
		for (size_t j = 0; j < ret[i].size(); ++j)
		{
			if (ret[i][j] != 1)
			{
				ret[i][j] = ret[i - 1][j - 1] + ret[i - 1][j];
			}
		}
	}
	return ret;
}
/*测试用例*/void Test2()
{
	cout << "****测试用例开始****" << endl;
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(1);
	v1.push_back(5);
	v1.push_back(7);
	v1.push_back(3);
	v1.push_back(2);
	v1.push_back(4);
	v1.push_back(4);
	v1.push_back(7);
	v1.push_back(2);

	vector<int>v2=singleNumber(v1);
	cout << v2[0] <<" " << v2[1] << endl;
	cout << "****测试用例结束****" << endl<<endl;
}

/*测试用例*/void Test3()
{
	cout << "****测试用例开始****" << endl;


	cout << "****测试用例结束****" << endl << endl;
}

//【笔记】
//【初阶】15.vector(2)
	//vector主要成员函数
		//默认：构造、拷贝构造、析构
		//迭代器：普通iterator、反向reverse_iterator、只读const_iterator、只读反向const_reverse_iterator
		//容量：size()、capacity()，容量大约按1.5倍扩容
		//[]和at：[]越界报错，at越界抛异常
		//insert和erase：指定位置插入、删除
		//迭代器失效
		// 迭代器创建后如果对象在插入或重构时发生增容或内存位置改变会导致原迭代器失效，要重新创建
		// 在发生成员删除导致的后续成员移位也可能导致迭代器失效或与预期实现不同的情况（vs编译报错、gcc编译通过但结果错误）
		// 【注】erase在使用会有一个迭代器类型的返回值iterator erase (iterator position);表示删除后迭代器的正确位置，利用返回值可以修正迭代器位置




